Run in Google Colab
|
A partir de la exploración inicial de los datos:
[75%] Análisis y propuestas accionables
[10%] Impacto en la ley de protección de datos
!pip install -q https://github.com/pandas-profiling/pandas-profiling/archive/master.zip
import pandas as pd
import numpy as np
from scipy import stats
import matplotlib.pyplot as plt
plt.style.use("ggplot")
import seaborn as sns
import pandas_profiling
def null_percentage(df, int_mode=False):
"""
Función encargada de calcular los porcentajes de nulidad
de cada columna del dataframe
:param df: el dataframe
:param int_mode: boolean que pregunta si la salida es
numérica
:return: un diccionario con los porcentajes por columna.
"""
null_percentages = dict()
for col in df.columns:
percentage = df[col].isna().sum() * 100
percentage /= df.shape[0]
if not int_mode:
percentage = f"{percentage}% of null values"
null_percentages[col] = percentage
return null_percentages
def drop_null_column(df, drop_perc=85):
"""
Función que se encarga de borrar las columnas con
un porcentaje de nulidad mayor al 85
:param df: el dataframe
:return: el dataframe limpio
"""
null_perc = null_percentage(df, int_mode=True)
for col in df.columns:
if null_perc[col] > drop_perc:
df.drop(columns=col, inplace=True)
def change_dtypes(df):
"""
Función que se encarga de verificar los tipos de
datos del dataset y los convierte a categóricos, int16
o float 16
:param df: Dataset al cual se le ajustarán los datos
"""
for idx, dtype in zip(df.dtypes.index, df.dtypes.values):
try:
if dtype == "object":
df[idx] = df[idx].astype("category")
elif dtype == "int64":
df[idx] = df[idx].astype("int16")
elif dtype == "float64":
df[idx] = df[idx].astype("float16")
except Exception as e:
print(e)
continue
def chi2test(table, ci=0.95):
"""
Función encargada de hacer la prueba de Chi2
para variables categóricas.
:param table: La tabla de variables
:param ci: el intervalo de confianza
"""
_, p_value, _, _ = stats.chi2_contingency(table)
print(f"Prueba de Chi2 con intervalo de confianza: {ci}")
print(f"El p-value equivale a: {p_value}")
alpha = 1. - ci
if p_value <= alpha:
print("Se rechaza la H0")
else:
print("No hay pruebas suficientes para rechazar H0")
data = pd.read_excel("Datos_parcial2.xlsx")
data.info()
pandas_profiling.ProfileReport(data)
change_dtypes(data)
plt.figure(figsize=(8, 6))
sns.scatterplot(x=data["PBK"], y=data["FLETES"])
plt.xlabel("Total Peso Bruto (Kilos)")
plt.ylabel("Costo del Flete")
plt.show()
plt.figure(figsize=(8, 6))
sns.scatterplot(x=data.FOBDOL, y=data.FLETES)
plt.xlabel("Valor Total Mercancía en Dólares")
plt.ylabel("Costo del Flete")
plt.show()
plt.figure(figsize=(8, 6))
ax = sns.catplot("VIA", kind="count", data=data, hue="PAIS")
ax.set_xticklabels(["Maritimo", "Terrestre",
"Aereo", "Transporte Fijo"], rotation=90)
plt.xlabel("Medio de Transporte")
plt.ylabel("Count")
plt.show()
ax = sns.catplot(x="COD_SAL", data=data, kind="count", hue="VIA")
ax.set_xticklabels(rotation=45)
plt.xlabel("Código de Salida")
plt.ylabel("Count")
plt.show()
data.duplicated().sum()
data = data.drop_duplicates()
data_final = data[["FLETES", "PBK", "COD_SAL", "VIA", "PAIS", "FOBDOL"]]
null_percentage(data_final)
data_final = data_final.dropna()
for idx, val in zip(data_final.dtypes.index, data_final.dtypes.values):
if val.name == "category":
print(f"Valores de {idx}: {data_final[idx].unique()}")
data_final["PBK"].min()
data_final["PBK"].max()
data_final["VIA"].unique()
data_final["FOBDOL"].min()
data_final["FOBDOL"].max()
"""
1. Maritimo
3. Terrestre
4. Aereo
7. Transporte Fijo
"""
via_dict = {
1: "Maritimo",
3: "Terrestre",
4: "Aereo",
7: "Via Fija"
}
data_final["VIA"] = data_final["VIA"].apply(lambda x: via_dict[x])
data_final = data_final.query("(FOBDOL > 0) & (PBK > 0)")
data_final.corr(method="pearson")
data_final.corr(method="spearman")
data_final.corr(method="kendall")
plt.figure(figsize=(8, 6))
sns.scatterplot(x=data_final.FOBDOL, y=data_final.FLETES)
plt.xlabel("Valor Total Mercancía en Dólares")
plt.ylabel("Costo del Flete")
plt.title("Costo del Flete Vs. Valor Total de la Mercancía")
plt.show()
tabla_salida = pd.crosstab(index=data_final["VIA"], columns=data_final["COD_SAL"])
chi2test(tabla_salida)
ax = sns.catplot(x="VIA", data=data_final, kind="count")
ax.set_xticklabels(rotation=45)
plt.xlabel("Vía de Transporte")
plt.ylabel("Count")
plt.title("Distribución de los Medios de Transporte")
plt.show()
ax = sns.catplot(x="COD_SAL", data=data_final, kind="count", hue="VIA")
ax.set_xticklabels(rotation=45)
plt.xlabel("Código de Salida")
plt.ylabel("Count")
plt.title("Distribución de Códigos de Salida con muestras por Via de transporte")
plt.show()